/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package simulateurs.model;

import java.awt.Color;
import java.util.ArrayList;
import simulateurs.interpreteur.ParserXML;
import simulateurs.model.automate.Automate;
import simulateurs.model.automate.CondBoole;
import simulateurs.model.automate.EtatsuivCondsAction;
import simulateurs.model.monde.*;
import simulateurs.model.scheduler.Scheduler;
import simulateurs.view.View;

/**
 *
 * @author Lunesco
 */
public class Model {
    private View view=null;
    private Scheduler scheduler=null;
    private ArrayList<Balle> listeBalles=null;
    private Arene arene = null;
    private int nbBallesRamassees=0;
    private String donneesInitiales=null;

    public Model(String donneesInitiales){
        this.donneesInitiales = donneesInitiales;
        arene = new Arene();
        initModel();
    }
    
    
    public void initMonde(){
        
        //System.out.println("Debut de l'initialisation du model");
        
        double largeurArene = 800;
        double hauteurArene = 600;
        ArrayList<But> butList = null;
        
        
        
        ParserXML parserjava = new ParserXML(donneesInitiales);
        
        System.out.println("Le rayon de la premiere balle est : " + parserjava.getListBalle().get(0).getRayon());
        
        // initialisation de l'attribut But de tous les robots de chaque equipe et renvoie une liste d'quipes pour l'arene
        butList = But.genererButsDepuisEquipelist(parserjava.getListEquipe(),largeurArene,hauteurArene);
        
        
        
        //System.out.println("le nombre de buts est : " + butList.size());
        //for(int p = 0;p<butList.size();p++){
            //System.out.println("Le but "+p+" est a : ("+butList.get(p).getCentre().getAbscisse()+","+butList.get(p).getCentre().getOrdonnee()+") de rayon : "+butList.get(p).getRayon());
        //}
        
        // /!\/!\ IL FAUT PLACER LES BALLES EN PREMIER ! /!\ /!\
        
        //Balle.genererPositionBalles(parserjava.getListBalle(),butList,largeurArene,hauteurArene);
        Balle.genererPositionBalles(parserjava.getListBalle(),parserjava.getListEquipe(),butList,largeurArene,hauteurArene);

        /*
        for(int x = 0;x < parserjava.getListEquipe().size();x++){
             Robot.genererPositionRobotsUneEquipe(parserjava.getListEquipe().get(x).getListeRobots(), largeurArene, hauteurArene);
        }
        */
        
        // il faut placer les equipes en deuxieme !
        Equipe.genererPositionRobotsUneEquipe(parserjava.getListEquipe(), parserjava.getListBalle(), butList,largeurArene, hauteurArene);
       
        
        listeBalles=parserjava.getListBalle();
        
        //arene = new Arene(parserjava.getListEquipe(),listeBalles,butList);
        arene.setlisteEquipes(parserjava.getListEquipe());
        arene.setListeBalles(listeBalles);
        arene.setListeButs(butList);
        
        // probleme, la couleur des robots est null !!
        System.out.println("la couleur du premier robot : " + parserjava.getListEquipe().get(0).getListeRobots().get(0).getCouleur());
        //System.out.println("La position du premier robot est a : ("+parserjava.getListEquipe().get(0).getListeRobots().get(0).getCentre().getAbscisse()+","+parserjava.getListEquipe().get(0).getListeRobots().get(0).getCentre().getOrdonnee()+") de rayon : "+parserjava.getListEquipe().get(0).getListeRobots().get(0).getRayon());
        
        
        
        // la liste des balles n'est pas null
        //System.out.println("Le nombre de balle est : " + parserjava.getListBalle().size());
        
        
        //if(parserjava.getListBalle()==null){
            //System.out.println("la liste des balles est null : ");
            
        //}
        
        
        //System.out.println("La taille de la premiere equipe : "+parserjava.getListEquipe().get(0).getListeRobots().size());
        //System.out.println("Le drapeau de la premiere equipe : "+parserjava.getListEquipe().get(0).getDrapeau());
        
        //System.out.println("La taille de la deuxieme equipe : "+parserjava.getListEquipe().get(1).getListeRobots().size());
        //System.out.println("Le drapeau de la deuxieme equipe : "+parserjava.getListEquipe().get(1).getDrapeau());
        
        
        /*
         *
         *  Test
         *
         *
         */
        /*
         * ArrayList<String> listee = new ArrayList<String>();
         * listee.add("a");
         * listee.add("b");
         * But.genererButsDepuisEquipelist(listee);
         * // on affiche la liste
         * System.out.println("Affichage de la liste de strings");
         * for (int y = 0; y < listee.size();y++){
         * System.out.println("liste " + y +" = " + listee.get(y));
         * }
         */
        
        // ArrayList<Equipe> listeEquipes, ArrayList<Balle> listeBalles, ArrayList<But> listeButs
        
        //arene = new Arene(parserjava.getListEquipe(),parserjava.getListBalle(),);
        
        
        
        
        // creation de l'arene, avec une equipe d'un robot !
        //   arene = new Arene(equipeList, balleList, butList);
        //System.out.println("equipeList.size() = " + equipeList.size());
        //System.out.println("taille premiere equipe : equipeList.get(0).getListeRobots().size()) = " + equipeList.get(0).getListeRobots().size());
        // il y a bien un robot dans la premiere equipe
        //System.out.println("Juste après la creation de l'arene");
        // creation de l'arene
        //Arene arene=new Arene(view.getModelPanel().getWidth(),view.getModelPanel().getHeight());
        //  Arene arene=new Arene()
        // creation d'un robot
        // ajoute un robot au bout de l'arene
        // robot1 = new Robot(view.getModelPanel().getWidth(), 100, 10, automates, 0);
        //   new Robot(view.getModelPanel().getHeight(), 0, 10, automates, 0);
        //listeRobots = new ArrayList<Robot>();
        //listeRobots.add(robot1);
        
        //ajout du robot dans l'arene
        //arene.setListeRobots(listeRobots);
        
        
    }
    
    private void initModel(){
        
        initMonde();
        
        /*
         *
         * CREATION DE LA VUE ET DU SCHEDULER
         *
         *
         */
        //System.out.println("Avant creation de la vue");
        view=new View(this);
        // System.out.println("Après creation de la vue");
        
        //System.out.println("Avant creation du scheduler");
        scheduler=new Scheduler(this);
        //System.out.println("Après creation du scheduler");
        
        /*
         while(true){
            nbBallesRamassees=0;
            //scheduler.update(); // !!! c'est le bon appel, a remetre après prototype et fonction scan
            scheduler.update();
            for(int i=0; i<this.arene.getListeEquipes().size(); i++){
                nbBallesRamassees+=this.arene.getListeEquipes().get(i).getScore();
            }
            if(nbBallesRamassees>=this.listeBalles.size()) this.view.getButtonsPanel().performStopper();
        }
        */
        while(true){
            nbBallesRamassees=0;
            //scheduler.update(); // !!! c'est le bon appel, a remetre après prototype et fonction scan
            scheduler.update();
           /* for(int i=0; i<this.arene.getListeEquipes().size(); i++){
                nbBallesRamassees+=this.arene.getListeEquipes().get(i).getScore();
            }
            */
            if(!arene.isFinDuJeu()){
            if(Balle.ballesRestantes(arene.getListeBalles(),arene.getListeEquipes())==false) this.view.getButtonsPanel().performStopper();
            

            }
        }
    }
    
    public ArrayList<Balle> getListeBalles() {
        return listeBalles;
    }
    
    public View getView() {
        return view;
    }
    
    public Arene getArene() {
        return arene;
    }
    
    public void setArene(Arene arene) {
        this.arene = arene;
    }
    
    public Scheduler getScheduler() {
        return scheduler;
    }
    
    
    

}
